#pragma once
#include <stdbool.h>
#include <stdio.h>

typedef enum {
  TLOG_ERROR_LEVEL      = 'E',
  TLOG_WARNING_LEVEL    = 'W',
  TLOG_INFO_LEVEL       = 'I',
  TLOG_DEBUG_LEVEL      = 'D',
  TLOG_TRACE_LEVEL      = 'T',
  TLOG_TYPE_LEVEL_TOTAL = 5,
} TLOG_LEVEL_T;

typedef enum {
  TLOG_ENABLE,
  TLOG_DISABLE,
  TLOG_STATE_TOTAL,
} TLOG_STATE_T;

/***************************************************************************************************
 * ******************************************Static var******************************************* *
 ***************************************************************************************************/
static bool TLOG_ERROR_FLAG   = TLOG_ENABLE;   // error级别
static bool TLOG_WARNING_FLAG = TLOG_ENABLE;   // warning级别
static bool TLOG_INFO_FLAG    = TLOG_ENABLE;   // info级别
static bool TLOG_DEBUG_FLAG   = TLOG_DISABLE;  // debug级别
static bool TLOG_TRACE_FLAG   = TLOG_ENABLE;   // trace级别

/***************************************************************************************************
 * ******************************************Define func****************************************** *
 ***************************************************************************************************/
#define TLOGE(tag, fmt, ...)                 \
  ({                                         \
    if (TLOG_ERROR_FLAG == TLOG_ENABLE) {    \
      printf(tag "[E]:" fmt, ##__VA_ARGS__); \
    }                                        \
  })
#define TLOGW(tag, fmt, ...)                 \
  ({                                         \
    if (TLOG_WARNING_FLAG == TLOG_ENABLE) {  \
      printf(tag "[W]:" fmt, ##__VA_ARGS__); \
    }                                        \
  })
#define TLOGI(tag, fmt, ...)                 \
  ({                                         \
    if (TLOG_INFO_FLAG == TLOG_ENABLE) {     \
      printf(tag "[I]:" fmt, ##__VA_ARGS__); \
    }                                        \
  })
#define TLOGD(tag, fmt, ...)                 \
  ({                                         \
    if (TLOG_DEBUG_FLAG == TLOG_ENABLE) {    \
      printf(tag "[D]:" fmt, ##__VA_ARGS__); \
    }                                        \
  })
#define TLOGT(tag, fmt, ...)                 \
  ({                                         \
    if (TLOG_TRACE_FLAG == TLOG_ENABLE) {    \
      printf(tag "[T]:" fmt, ##__VA_ARGS__); \
    }                                        \
  })
//

void         tlog_set_log_level_state(TLOG_LEVEL_T type, TLOG_STATE_T state);
TLOG_STATE_T tlog_get_log_level_state(TLOG_LEVEL_T type);
